﻿//
//  spectrum_library.cpp
//
//  Created by 渡部 心 on 2015/09/27.
//  Copyright (c) 2015年 渡部 心. All rights reserved.
//

#include "spectrum_library.h"

namespace SLR {
    namespace SpectrumLibrary {
        namespace Illuminant {
            const float D65_values[] = {
                0.0341, 0.36014, 0.68618, 1.01222, 1.33826, 1.6643, 1.99034, 2.31638,
                2.64242, 2.96846, 3.2945, 4.98865, 6.6828, 8.37695, 10.0711, 11.7652,
                13.4594, 15.1535, 16.8477, 18.5418, 20.236, 21.9177, 23.5995, 25.2812,
                26.963, 28.6447, 30.3265, 32.0082, 33.69, 35.3717, 37.0535, 37.343,
                37.6326, 37.9221, 38.2116, 38.5011, 38.7907, 39.0802, 39.3697, 39.6593,
                39.9488, 40.4451, 40.9414, 41.4377, 41.934, 42.4302, 42.9265, 43.4228,
                43.9191, 44.4154, 44.9117, 45.0844, 45.257, 45.4297, 45.6023, 45.775,
                45.9477, 46.1203, 46.293, 46.4656, 46.6383, 47.1834, 47.7285, 48.2735,
                48.8186, 49.3637, 49.9088, 50.4539, 50.9989, 51.544, 52.0891, 51.8777,
                51.6664, 51.455, 51.2437, 51.0323, 50.8209, 50.6096, 50.3982, 50.1869,
                49.9755, 50.4428, 50.91, 51.3773, 51.8446, 52.3118, 52.7791, 53.2464,
                53.7137, 54.1809, 54.6482, 57.4589, 60.2695, 63.0802, 65.8909, 68.7015,
                71.5122, 74.3229, 77.1336, 79.9442, 82.7549, 83.628, 84.5011, 85.3742,
                86.2473, 87.1204, 87.9936, 88.8667, 89.7398, 90.6129, 91.486, 91.6806,
                91.8752, 92.0697, 92.2643, 92.4589, 92.6535, 92.8481, 93.0426, 93.2372,
                93.4318, 92.7568, 92.0819, 91.4069, 90.732, 90.057, 89.3821, 88.7071,
                88.0322, 87.3572, 86.6823, 88.5006, 90.3188, 92.1371, 93.9554, 95.7736,
                97.5919, 99.4102, 101.228, 103.047, 104.865, 106.079, 107.294, 108.508,
                109.722, 110.936, 112.151, 113.365, 114.579, 115.794, 117.008, 117.088,
                117.169, 117.249, 117.33, 117.41, 117.49, 117.571, 117.651, 117.732,
                117.812, 117.517, 117.222, 116.927, 116.632, 116.336, 116.041, 115.746,
                115.451, 115.156, 114.861, 114.967, 115.073, 115.18, 115.286, 115.392,
                115.498, 115.604, 115.711, 115.817, 115.923, 115.212, 114.501, 113.789,
                113.078, 112.367, 111.656, 110.945, 110.233, 109.522, 108.811, 108.865,
                108.92, 108.974, 109.028, 109.082, 109.137, 109.191, 109.245, 109.3,
                109.354, 109.199, 109.044, 108.888, 108.733, 108.578, 108.423, 108.268,
                108.112, 107.957, 107.802, 107.501, 107.2, 106.898, 106.597, 106.296,
                105.995, 105.694, 105.392, 105.091, 104.79, 105.08, 105.37, 105.66,
                105.95, 106.239, 106.529, 106.819, 107.109, 107.399, 107.689, 107.361,
                107.032, 106.704, 106.375, 106.047, 105.719, 105.39, 105.062, 104.733,
                104.405, 104.369, 104.333, 104.297, 104.261, 104.225, 104.19, 104.154,
                104.118, 104.082, 104.046, 103.641, 103.237, 102.832, 102.428, 102.023,
                101.618, 101.214, 100.809, 100.405, 100, 99.6334, 99.2668, 98.9003,
                98.5337, 98.1671, 97.8005, 97.4339, 97.0674, 96.7008, 96.3342, 96.2796,
                96.225, 96.1703, 96.1157, 96.0611, 96.0065, 95.9519, 95.8972, 95.8426,
                95.788, 95.0778, 94.3675, 93.6573, 92.947, 92.2368, 91.5266, 90.8163,
                90.1061, 89.3958, 88.6856, 88.8177, 88.9497, 89.0818, 89.2138, 89.3459,
                89.478, 89.61, 89.7421, 89.8741, 90.0062, 89.9655, 89.9248, 89.8841,
                89.8434, 89.8026, 89.7619, 89.7212, 89.6805, 89.6398, 89.5991, 89.4091,
                89.219, 89.029, 88.8389, 88.6489, 88.4589, 88.2688, 88.0788, 87.8887,
                87.6987, 87.2577, 86.8167, 86.3757, 85.9347, 85.4936, 85.0526, 84.6116,
                84.1706, 83.7296, 83.2886, 83.3297, 83.3707, 83.4118, 83.4528, 83.4939,
                83.535, 83.576, 83.6171, 83.6581, 83.6992, 83.332, 82.9647, 82.5975,
                82.2302, 81.863, 81.4958, 81.1285, 80.7613, 80.394, 80.0268, 80.0456,
                80.0644, 80.0831, 80.1019, 80.1207, 80.1395, 80.1583, 80.177, 80.1958,
                80.2146, 80.4209, 80.6272, 80.8336, 81.0399, 81.2462, 81.4525, 81.6588,
                81.8652, 82.0715, 82.2778, 81.8784, 81.4791, 81.0797, 80.6804, 80.281,
                79.8816, 79.4823, 79.0829, 78.6836, 78.2842, 77.4279, 76.5716, 75.7153,
                74.859, 74.0027, 73.1465, 72.2902, 71.4339, 70.5776, 69.7213, 69.9101,
                70.0989, 70.2876, 70.4764, 70.6652, 70.854, 71.0428, 71.2315, 71.4203,
                71.6091, 71.8831, 72.1571, 72.4311, 72.7051, 72.979, 73.253, 73.527,
                73.801, 74.075, 74.349, 73.0745, 71.8, 70.5255, 69.251, 67.9765,
                66.702, 65.4275, 64.153, 62.8785, 61.604, 62.4322, 63.2603, 64.0885,
                64.9166, 65.7448, 66.573, 67.4011, 68.2293, 69.0574, 69.8856, 70.4057,
                70.9259, 71.446, 71.9662, 72.4863, 73.0064, 73.5266, 74.0467, 74.5669,
                75.087, 73.9376, 72.7881, 71.6387, 70.4893, 69.3398, 68.1904, 67.041,
                65.8916, 64.7421, 63.5927, 61.8752, 60.1578, 58.4403, 56.7229, 55.0054,
                53.288, 51.5705, 49.8531, 48.1356, 46.4182, 48.4569, 50.4956, 52.5344,
                54.5731, 56.6118, 58.6505, 60.6892, 62.728, 64.7667, 66.8054, 66.4631,
                66.1209, 65.7786, 65.4364, 65.0941, 64.7518, 64.4096, 64.0673, 63.7251,
                63.3828, 63.4749, 63.567, 63.6592, 63.7513, 63.8434, 63.9355, 64.0276,
                64.1198, 64.2119, 64.304, 63.8188, 63.3336, 62.8484, 62.3632, 61.8779,
                61.3927, 60.9075, 60.4223, 59.9371, 59.4519, 58.7026, 57.9533, 57.204,
                56.4547, 55.7054, 54.9562, 54.2069, 53.4576, 52.7083, 51.959, 52.5072,
                53.0553, 53.6035, 54.1516, 54.6998, 55.248, 55.7961, 56.3443, 56.8924,
                57.4406, 57.7278, 58.015, 58.3022, 58.5894, 58.8765, 59.1637, 59.4509,
                59.7381, 60.0253, 60.3125
            }; // Total Energy: 40822.0307
            const Data D65 = {
                DistributionType::Regular,
                531, 300.0f, 830.0f,
                nullptr,
                D65_values
            };
            
            const float E_values[] = {
                77.0227, 77.0227
            }; // Each energy is set so that the total energy matches that of D65. 
            const Data E = {
                DistributionType::Regular,
                2, 300.0f, 830.0f,
                nullptr,
                E_values
            };
            
            
            
            const std::map<std::string, std::vector<Data>> database = {
                {"D65", {D65}}, {"E", {E}},
            };
        }
        
        namespace Reflectance {
            const float DarkSkin_values[] = {
                0.055, 0.058, 0.061, 0.062, 0.062, 0.062, 0.062, 0.062,
                0.062, 0.062, 0.062, 0.063, 0.065, 0.070, 0.076, 0.079,
                0.081, 0.084, 0.091, 0.103, 0.119, 0.134, 0.143, 0.147,
                0.151, 0.158, 0.168, 0.179, 0.188, 0.190, 0.186, 0.181,
                0.182, 0.187, 0.196, 0.209
            };
            const Data DarkSkin = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                DarkSkin_values
            };
            const float LightSkin_values[] = {
                0.117, 0.143, 0.175, 0.191, 0.196, 0.199, 0.204, 0.213,
                0.228, 0.251, 0.280, 0.309, 0.329, 0.333, 0.315, 0.286,
                0.273, 0.276, 0.277, 0.289, 0.339, 0.420, 0.488, 0.525,
                0.546, 0.562, 0.578, 0.595, 0.612, 0.625, 0.638, 0.656,
                0.678, 0.700, 0.717, 0.734
            };
            const Data LightSkin = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                LightSkin_values
            };
            const float BlueSky_values[] = {
                0.130, 0.177, 0.251, 0.306, 0.324, 0.330, 0.333, 0.331,
                0.323, 0.311, 0.298, 0.285, 0.269, 0.250, 0.231, 0.214,
                0.199, 0.185, 0.169, 0.157, 0.149, 0.145, 0.142, 0.141,
                0.141, 0.141, 0.143, 0.147, 0.152, 0.154, 0.150, 0.144,
                0.136, 0.132, 0.135, 0.147
            };
            const Data BlueSky = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                BlueSky_values
            };
            const float Foliage_values[] = {
                0.051, 0.054, 0.056, 0.057, 0.058, 0.059, 0.060, 0.061,
                0.062, 0.063, 0.065, 0.067, 0.075, 0.101, 0.145, 0.178,
                0.184, 0.170, 0.149, 0.133, 0.122, 0.115, 0.109, 0.105,
                0.104, 0.106, 0.109, 0.112, 0.114, 0.114, 0.112, 0.112,
                0.115, 0.120, 0.125, 0.130
            };
            const Data Foliage = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                Foliage_values
            };
            const float BlueFlower_values[] = {
                0.144, 0.198, 0.294, 0.375, 0.408, 0.421, 0.426, 0.426,
                0.419, 0.403, 0.379, 0.346, 0.311, 0.281, 0.254, 0.229,
                0.214, 0.208, 0.202, 0.194, 0.193, 0.200, 0.214, 0.230,
                0.241, 0.254, 0.279, 0.313, 0.348, 0.366, 0.366, 0.359,
                0.358, 0.365, 0.377, 0.398
            };
            const Data BlueFlower = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                BlueFlower_values
            };
            const float BluishGreen_values[] = {
                0.136, 0.179, 0.247, 0.297, 0.320, 0.337, 0.355, 0.381,
                0.419, 0.466, 0.510, 0.546, 0.567, 0.574, 0.569, 0.551,
                0.524, 0.488, 0.445, 0.400, 0.350, 0.299, 0.252, 0.221,
                0.204, 0.196, 0.191, 0.188, 0.191, 0.199, 0.212, 0.223,
                0.232, 0.233, 0.229, 0.229
            };
            const Data BluishGreen = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                BluishGreen_values
            };
            const float Orange_values[] = {
                0.054, 0.054, 0.053, 0.054, 0.054, 0.055, 0.055, 0.055,
                0.056, 0.057, 0.058, 0.061, 0.068, 0.089, 0.125, 0.154,
                0.174, 0.199, 0.248, 0.335, 0.444, 0.538, 0.587, 0.595,
                0.591, 0.587, 0.584, 0.584, 0.590, 0.603, 0.620, 0.639,
                0.655, 0.663, 0.663, 0.667
            };
            const Data Orange = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                Orange_values
            };
            const float PurplishBlue_values[] = {
                0.122, 0.164, 0.229, 0.286, 0.327, 0.361, 0.388, 0.400,
                0.392, 0.362, 0.316, 0.260, 0.209, 0.168, 0.138, 0.117,
                0.104, 0.096, 0.090, 0.086, 0.084, 0.084, 0.084, 0.084,
                0.084, 0.085, 0.090, 0.098, 0.109, 0.123, 0.143, 0.169,
                0.205, 0.244, 0.287, 0.332
            };
            const Data PurplishBlue = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                PurplishBlue_values
            };
            const float ModerateRed_values[] = {
                0.096, 0.115, 0.131, 0.135, 0.133, 0.132, 0.130, 0.128,
                0.125, 0.120, 0.115, 0.110, 0.105, 0.100, 0.095, 0.093,
                0.092, 0.093, 0.096, 0.108, 0.156, 0.265, 0.399, 0.500,
                0.556, 0.579, 0.588, 0.591, 0.593, 0.594, 0.598, 0.602,
                0.607, 0.609, 0.609, 0.610
            };
            const Data ModerateRed = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                ModerateRed_values
            };
            const float Purple_values[] = {
                0.092, 0.116, 0.146, 0.169, 0.178, 0.173, 0.158, 0.139,
                0.119, 0.101, 0.087, 0.075, 0.066, 0.060, 0.056, 0.053,
                0.051, 0.051, 0.052, 0.052, 0.051, 0.052, 0.058, 0.073,
                0.096, 0.119, 0.141, 0.166, 0.194, 0.227, 0.265, 0.309,
                0.355, 0.396, 0.436, 0.478
            };
            const Data Purple = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                Purple_values
            };
            const float YellowGreen_values[] = {
                0.061, 0.061, 0.062, 0.063, 0.064, 0.066, 0.069, 0.075,
                0.085, 0.105, 0.139, 0.192, 0.271, 0.376, 0.476, 0.531,
                0.549, 0.546, 0.528, 0.504, 0.471, 0.428, 0.381, 0.347,
                0.327, 0.318, 0.312, 0.310, 0.314, 0.327, 0.345, 0.363,
                0.376, 0.381, 0.378, 0.379
            };
            const Data YellowGreen = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                YellowGreen_values
            };
            const float OrangeYellow_values[] = {
                0.063, 0.063, 0.063, 0.064, 0.064, 0.064, 0.065, 0.066,
                0.067, 0.068, 0.071, 0.076, 0.087, 0.125, 0.206, 0.305,
                0.383, 0.431, 0.469, 0.518, 0.568, 0.607, 0.628, 0.637,
                0.640, 0.642, 0.645, 0.648, 0.651, 0.653, 0.657, 0.664,
                0.673, 0.680, 0.684, 0.688
            };
            const Data OrangeYellow = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                OrangeYellow_values
            };
            const float Blue_values[] = {
                0.066, 0.079, 0.102, 0.146, 0.200, 0.244, 0.282, 0.309,
                0.308, 0.278, 0.231, 0.178, 0.130, 0.094, 0.070, 0.054,
                0.046, 0.042, 0.039, 0.038, 0.038, 0.038, 0.038, 0.039,
                0.039, 0.040, 0.041, 0.042, 0.044, 0.045, 0.046, 0.046,
                0.048, 0.052, 0.057, 0.065
            };
            const Data Blue = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                Blue_values
            };
            const float Green_values[] = {
                0.052, 0.053, 0.054, 0.055, 0.057, 0.059, 0.061, 0.066,
                0.075, 0.093, 0.125, 0.178, 0.246, 0.307, 0.337, 0.334,
                0.317, 0.293, 0.262, 0.230, 0.198, 0.165, 0.135, 0.115,
                0.104, 0.098, 0.094, 0.092, 0.093, 0.097, 0.102, 0.108,
                0.113, 0.115, 0.114, 0.114
            };
            const Data Green = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                Green_values
            };
            const float Red_values[] = {
                0.050, 0.049, 0.048, 0.047, 0.047, 0.047, 0.047, 0.047,
                0.046, 0.045, 0.044, 0.044, 0.045, 0.046, 0.047, 0.048,
                0.049, 0.050, 0.054, 0.060, 0.072, 0.104, 0.178, 0.312,
                0.467, 0.581, 0.644, 0.675, 0.690, 0.698, 0.706, 0.715,
                0.724, 0.730, 0.734, 0.738
            };
            const Data Red = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                Red_values
            };
            const float Yellow_values[] = {
                0.058, 0.054, 0.052, 0.052, 0.053, 0.054, 0.056, 0.059,
                0.067, 0.081, 0.107, 0.152, 0.225, 0.336, 0.462, 0.559,
                0.616, 0.650, 0.672, 0.694, 0.710, 0.723, 0.731, 0.739,
                0.746, 0.752, 0.758, 0.764, 0.769, 0.771, 0.776, 0.782,
                0.790, 0.796, 0.799, 0.804
            };
            const Data Yellow = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                Yellow_values
            };
            const float Magent_values[] = {
                0.145, 0.195, 0.283, 0.346, 0.362, 0.354, 0.334, 0.306,
                0.276, 0.248, 0.218, 0.190, 0.168, 0.149, 0.127, 0.107,
                0.100, 0.102, 0.104, 0.109, 0.137, 0.200, 0.290, 0.400,
                0.516, 0.615, 0.687, 0.732, 0.760, 0.774, 0.783, 0.793,
                0.803, 0.812, 0.817, 0.825
            };
            const Data Magent = {
                DistributionType::Regular,
                36, 380.0f, 730.0f,
                nullptr,
                Magent_values
            };
            const float Cyan_values[] = {
                0.108, 0.141, 0.192, 0.236, 0.261, 0.286, 0.317, 0.353,
                0.390, 0.426, 0.446, 0.444, 0.423, 0.385, 0.337, 0.283,
                0.231, 0.185, 0.146, 0.118, 0.101, 0.090, 0.082, 0.076,
                0.074, 0.073, 0.073, 0.074, 0.076, 0.077, 0.076, 0.075,
                0.073, 0.072, 0.074, 0.079
            };
            const Data Cyan = {
                DistributionType::Regular, 
                36, 380.0f, 730.0f, 
                nullptr,
                Cyan_values
            };
            const float White95_values[] = {
                0.189, 0.255, 0.423, 0.660, 0.811, 0.862, 0.877, 0.884,
                0.891, 0.896, 0.899, 0.904, 0.907, 0.909, 0.911, 0.910,
                0.911, 0.914, 0.913, 0.916, 0.915, 0.916, 0.914, 0.915,
                0.918, 0.919, 0.921, 0.923, 0.924, 0.922, 0.922, 0.925,
                0.927, 0.930, 0.930, 0.933
            };
            const Data White95 = {
                DistributionType::Regular, 
                36, 380.0f, 730.0f, 
                nullptr,
                White95_values
            };
            const float Neutral80_values[] = {
                0.171, 0.232, 0.365, 0.507, 0.567, 0.583, 0.588, 0.590,
                0.591, 0.590, 0.588, 0.588, 0.589, 0.589, 0.591, 0.590,
                0.590, 0.590, 0.589, 0.591, 0.590, 0.590, 0.587, 0.585,
                0.583, 0.580, 0.578, 0.576, 0.574, 0.572, 0.571, 0.569,
                0.568, 0.568, 0.566, 0.566
            };
            const Data Neutral80 = {
                DistributionType::Regular, 
                36, 380.0f, 730.0f, 
                nullptr,
                Neutral80_values
            };
            const float Neutral65_values[] = {
                0.144, 0.192, 0.272, 0.331, 0.350, 0.357, 0.361, 0.363,
                0.363, 0.361, 0.359, 0.358, 0.358, 0.359, 0.360, 0.360,
                0.361, 0.361, 0.360, 0.362, 0.362, 0.361, 0.359, 0.358,
                0.355, 0.352, 0.350, 0.348, 0.345, 0.343, 0.340, 0.338,
                0.335, 0.334, 0.332, 0.331
            };
            const Data Neutral65 = {
                DistributionType::Regular, 
                36, 380.0f, 730.0f, 
                nullptr,
                Neutral65_values
            };
            const float Neutral50_values[] = {
                0.105, 0.131, 0.163, 0.180, 0.186, 0.190, 0.193, 0.194,
                0.194, 0.192, 0.191, 0.191, 0.191, 0.192, 0.192, 0.192,
                0.192, 0.192, 0.192, 0.193, 0.192, 0.192, 0.191, 0.189,
                0.188, 0.186, 0.184, 0.182, 0.181, 0.179, 0.178, 0.176,
                0.174, 0.173, 0.172, 0.171
            };
            const Data Neutral50 = {
                DistributionType::Regular, 
                36, 380.0f, 730.0f, 
                nullptr,
                Neutral50_values
            };
            const float Neutral35_values[] = {
                0.068, 0.077, 0.084, 0.087, 0.089, 0.090, 0.092, 0.092,
                0.091, 0.090, 0.090, 0.090, 0.090, 0.090, 0.090, 0.090,
                0.090, 0.090, 0.090, 0.090, 0.090, 0.089, 0.089, 0.088,
                0.087, 0.086, 0.086, 0.085, 0.084, 0.084, 0.083, 0.083,
                0.082, 0.081, 0.081, 0.081
            };
            const Data Neutral35 = {
                DistributionType::Regular, 
                36, 380.0f, 730.0f, 
                nullptr,
                Neutral35_values
            };
            const float Black2_values[] = {
                0.031, 0.032, 0.032, 0.033, 0.033, 0.033, 0.033, 0.033,
                0.032, 0.032, 0.032, 0.032, 0.032, 0.032, 0.032, 0.032,
                0.032, 0.032, 0.032, 0.032, 0.032, 0.032, 0.032, 0.032,
                0.032, 0.032, 0.032, 0.032, 0.032, 0.032, 0.032, 0.032,
                0.032, 0.032, 0.032, 0.033
            };
            const Data Black2 = {
                DistributionType::Regular, 
                36, 380.0f, 730.0f, 
                nullptr,
                Black2_values
            };
            
            
            
            const std::map<std::string, std::vector<Data>> database = {
                {"Color Checker", {
                    DarkSkin, LightSkin, BlueSky, Foliage, BlueFlower, BluishGreen,
                    Orange, PurplishBlue, ModerateRed, Purple, YellowGreen, OrangeYellow,
                    Blue, Green, Red, Yellow, Magent, Cyan,
                    White95, Neutral80, Neutral65, Neutral50, Neutral35, Black2
                }},
            };
        }
        
        namespace IoR {
            // Ciddor 1996
            const float Air_eta_values[] = {1.000308003, 1.000303036, 1.00029911, 1.000295938, 1.000293329, 1.000291152, 1.000289313, 1.000287743, 1.000286391, 1.000285217, 1.000284191, 1.000283287, 1.000282488, 1.000281777, 1.000281141, 1.00028057, 1.000280056, 1.00027959, 1.000279168, 1.000278783, 1.000278432, 1.00027811, 1.000277814, 1.000277542, 1.000277291, 1.000277059, 1.000276844, 1.000276644, 1.000276458, 1.000276285, 1.000276123, 1.000275972, 1.000275831, 1.000275698, 1.000275573, 1.000275456, 1.000275346, 1.000275242, 1.000275144, 1.000275051, 1.000274964, 1.000274881, 1.000274802, 1.000274728, 1.000274657, 1.00027459, 1.000274526, 1.000274465, 1.000274407, 1.000274352, 1.000274299, 1.000274249, 1.0002742, 1.000274154, 1.000274111, 1.000274068, 1.000274027, 1.00027399, 1.000273951, 1.000273917, 1.000273882, 1.000273848, 1.000273818, 1.000273787, 1.000273759, 1.00027373, 1.000273702, 1.000273677, 1.000273651, 1.000273627, 1.000273603, 1.00027358, 1.000273559, 1.000273537, 1.000273518, 1.000273497, 1.000273478, 1.00027346, 1.000273442, 1.000273425, 1.000273408, 1.000273391, 1.000273376, 1.00027336, 1.000273346, 1.000273331, 1.000273317, 1.000273304, 1.00027329, 1.000273278, 1.000273265, 1.000273253, 1.000273242, 1.00027323, 1.000273219, 1.000273208, 1.000273197, 1.000273188, 1.000273177, 1.000273168, 1.000273158};
            const Data Air_eta = {
                DistributionType::Regular,
                101, 230, 1690,
                nullptr,
                Air_eta_values
            };
            
            const float Water_lambdas[] = {200, 225, 250, 275, 300, 325, 350, 375, 400, 425, 450, 475, 500, 525, 550, 575, 600, 625, 650, 675, 700, 725, 750, 775, 800, 825, 850, 875, 900, 925, 950, 975, 1000, 1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600, 2650, 2700, 2750, 2800, 2850, 2900, 2950, 3000, 3050, 3100, 3150, 3200, 3250, 3300, 3350, 3400, 3450, 3500, 3600, 3700, 3800, 3900, 4000, 4100, 4200, 4300, 4400, 4500, 4600, 4700, 4800, 4900, 5000, 5100, 5200, 5300, 5400, 5500, 5600, 5700, 5800, 5900, 6000, 6100, 6200, 6300, 6400, 6500, 6600, 6700, 6800, 6900, 7000, 7100, 7200, 7300, 7400, 7500, 7600, 7700, 7800, 7900, 8000, 8200, 8400, 8600, 8800, 9000, 9200, 9400, 9600, 9800, 10000, 10500, 11000, 11500, 12000, 12500, 13000, 13500, 14000, 14500, 15000, 15500, 16000, 16500, 17000, 17500, 18000, 18500, 19000, 19500, 20000, 21000, 22000, 23000, 24000, 25000, 26000, 27000, 28000, 29000, 30000, 32000, 34000, 36000, 38000, 40000, 42000, 44000, 46000, 48000, 50000, 60000, 70000, 80000, 90000, 100000, 110000, 120000, 130000, 140000, 150000, 160000, 170000, 180000, 190000, 200000};
            const float Water_eta_values[] = {1.396, 1.373, 1.362, 1.354, 1.349, 1.346, 1.343, 1.341, 1.339, 1.338, 1.337, 1.336, 1.335, 1.334, 1.333, 1.333, 1.332, 1.332, 1.331, 1.331, 1.331, 1.33, 1.33, 1.33, 1.329, 1.329, 1.329, 1.328, 1.328, 1.328, 1.327, 1.327, 1.327, 1.324, 1.321, 1.317, 1.312, 1.306, 1.296, 1.279, 1.242, 1.219, 1.188, 1.157, 1.142, 1.149, 1.201, 1.292, 1.371, 1.426, 1.467, 1.483, 1.478, 1.467, 1.45, 1.432, 1.42, 1.41, 1.4, 1.385, 1.374, 1.364, 1.357, 1.351, 1.346, 1.342, 1.338, 1.334, 1.332, 1.33, 1.33, 1.33, 1.328, 1.325, 1.322, 1.317, 1.312, 1.305, 1.298, 1.289, 1.277, 1.262, 1.248, 1.265, 1.319, 1.363, 1.357, 1.347, 1.339, 1.334, 1.329, 1.324, 1.321, 1.317, 1.314, 1.312, 1.309, 1.307, 1.304, 1.302, 1.299, 1.297, 1.294, 1.291, 1.286, 1.281, 1.275, 1.269, 1.262, 1.255, 1.247, 1.239, 1.229, 1.218, 1.185, 1.153, 1.126, 1.111, 1.123, 1.146, 1.177, 1.21, 1.241, 1.27, 1.297, 1.325, 1.351, 1.376, 1.401, 1.423, 1.443, 1.461, 1.476, 1.48, 1.487, 1.5, 1.511, 1.521, 1.531, 1.539, 1.545, 1.549, 1.551, 1.551, 1.546, 1.536, 1.527, 1.522, 1.519, 1.522, 1.53, 1.541, 1.555, 1.587, 1.703, 1.821, 1.886, 1.924, 1.957, 1.966, 2.004, 2.036, 2.056, 2.069, 2.081, 2.094, 2.107, 2.119, 2.13};
            const float Water_k_values[] = {1.10E-07, 4.90E-08, 3.35E-08, 2.35E-08, 1.60E-08, 1.08E-08, 6.50E-09, 3.50E-09, 1.86E-09, 1.30E-09, 1.02E-09, 9.35E-10, 1.00E-09, 1.32E-09, 1.96E-09, 3.60E-09, 1.09E-08, 1.39E-08, 1.64E-08, 2.23E-08, 3.35E-08, 9.15E-08, 1.56E-07, 1.48E-07, 1.25E-07, 1.82E-07, 2.93E-07, 3.91E-07, 4.86E-07, 1.06E-06, 2.93E-06, 3.48E-06, 2.89E-06, 9.89E-06, 1.38E-04, 8.55E-05, 1.15E-04, 1.10E-03, 2.89E-04, 9.56E-04, 3.17E-03, 6.70E-03, 0.019, 0.059, 0.115, 0.185, 0.268, 0.298, 0.272, 0.24, 0.192, 0.135, 0.0924, 0.061, 0.0368, 0.0261, 0.0195, 0.0132, 0.0094, 0.00515, 0.0036, 0.0034, 0.0038, 0.0046, 0.00562, 0.00688, 0.00845, 0.0103, 0.0134, 0.0147, 0.0157, 0.015, 0.0137, 0.0124, 0.0111, 0.0101, 0.0098, 0.0103, 0.0116, 0.0142, 0.0203, 0.033, 0.0622, 0.107, 0.131, 0.088, 0.057, 0.0449, 0.0392, 0.0356, 0.0337, 0.0327, 0.0322, 0.032, 0.032, 0.0321, 0.0322, 0.0324, 0.0326, 0.0328, 0.0331, 0.0335, 0.0339, 0.0343, 0.0351, 0.0361, 0.0372, 0.0385, 0.0399, 0.0415, 0.0433, 0.0454, 0.0479, 0.0508, 0.0662, 0.0968, 0.142, 0.199, 0.259, 0.305, 0.343, 0.37, 0.388, 0.402, 0.414, 0.422, 0.428, 0.429, 0.429, 0.426, 0.421, 0.414, 0.404, 0.393, 0.382, 0.373, 0.367, 0.361, 0.356, 0.35, 0.344, 0.338, 0.333, 0.328, 0.324, 0.329, 0.343, 0.361, 0.385, 0.409, 0.436, 0.462, 0.488, 0.514, 0.587, 0.576, 0.547, 0.536, 0.532, 0.531, 0.526, 0.514, 0.5, 0.495, 0.496, 0.497, 0.499, 0.501, 0.504};
            const Data Water_eta = {
                DistributionType::Irregular,
                169, Water_lambdas[0], Water_lambdas[168],
                Water_lambdas,
                Water_eta_values
            };
            const Data Water_k = {
                DistributionType::Irregular,
                169, Water_lambdas[0], Water_lambdas[168],
                Water_lambdas,
                Water_k_values
            };
            
            
            
            // S-BSL7 (OHARA)
            const float Glass_BK7_eta_values[] = {1.555856187, 1.548495021, 1.542683098, 1.538002936, 1.534170378, 1.530986072, 1.528306523, 1.526026139, 1.524065717, 1.522364838, 1.520876718, 1.519564649, 1.518399479, 1.517357811, 1.516420676, 1.51557256, 1.514800671, 1.514094381, 1.513444797, 1.512844432, 1.512286941, 1.511766922, 1.511279749, 1.51082144, 1.510388554, 1.509978102, 1.509587481, 1.50921441, 1.508856889, 1.508513154, 1.508181644, 1.507860975, 1.507549919, 1.507247375, 1.50695789, 1.506657239, 1.506376188, 1.506100219, 1.505828696, 1.505561045, 1.505296743, 1.505035314, 1.504776325, 1.50451938, 1.504264118, 1.503998143, 1.503745318, 1.503493244, 1.503241663, 1.502990337, 1.502739046, 1.502487586, 1.502235766, 1.501983412, 1.501730359, 1.501464339, 1.501209389, 1.500953303, 1.500695958, 1.500437237, 1.500177029, 1.49991523, 1.499651744, 1.499386477, 1.499119343, 1.498837394, 1.498566183, 1.498292865, 1.49801737, 1.497739631, 1.497459583, 1.497177165, 1.496892318, 1.496604987, 1.496315116, 1.496008662, 1.495713432, 1.49541551, 1.495114851, 1.494811408, 1.494505138, 1.494195999, 1.493883951, 1.493568952, 1.493250964, 1.492914587, 1.492590362, 1.492263035, 1.491932571, 1.491598935, 1.491262093, 1.490922011, 1.490578657, 1.490231997, 1.489882001, 1.489511724, 1.489154796, 1.488794436, 1.488430613, 1.488063297, 1.487692457};
            const Data Glass_BK7_eta = {
                DistributionType::Regular,
                101, 290, 2400,
                nullptr,
                Glass_BK7_eta_values
            };
            
            // Peter 1923 - Diamond
            const float Diamond_eta_values[] = {2.717356907, 2.694708171, 2.674393904, 2.656668055, 2.6404798, 2.62614251, 2.613118785, 2.601016433, 2.590136585, 2.579944156, 2.570715169, 2.56216871, 2.554088563, 2.546711251, 2.539702761, 2.533275459, 2.527254383, 2.521500448, 2.516194603, 2.511107364, 2.506401715, 2.501958217, 2.497679692, 2.493706214, 2.489870822, 2.48630054, 2.482909015, 2.479624703, 2.476557926, 2.473582354, 2.470798726, 2.468142054, 2.465557695, 2.463134014, 2.460772605, 2.458554666, 2.456429801, 2.454355105, 2.452402442, 2.45049339, 2.448694359, 2.446965334, 2.445271886, 2.443673255, 2.442105782, 2.44062448, 2.439196967, 2.437795124, 2.436468367, 2.435164222, 2.433928783, 2.432735425, 2.43156084, 2.43044669, 2.429349151, 2.428307237, 2.427298759, 2.426304155, 2.42535888, 2.424425923, 2.4235386, 2.422678207, 2.421828147, 2.421018846, 2.420218741, 2.419456513, 2.418716236, 2.417983692, 2.417285196, 2.41659359, 2.415933751, 2.415291994, 2.41465604, 2.414048801, 2.413446735, 2.412871556, 2.412311415, 2.411755627, 2.411224267, 2.410696785, 2.41019225, 2.409700327, 2.40921166, 2.408743937, 2.408279106, 2.407834007, 2.40739957, 2.406967549, 2.406553613, 2.406141814, 2.405747098, 2.405361459, 2.404977591, 2.40460944, 2.404242845, 2.403891131, 2.403547196, 2.403204533, 2.40287561, 2.402547792, 2.402233014};
            const Data Diamond_eta = {
                DistributionType::Regular,
                101, 226, 760,
                nullptr,
                Diamond_eta_values
            };
            
            
            
            const float Aluminium_lambdas[] = {206.6, 210.8950832, 215.2794584, 219.7549821, 224.323549, 228.9870936, 233.7475903, 238.6070547, 243.5675442, 248.6311593, 253.8000437, 259.0763859, 264.4624199, 269.9604262, 275.5727325, 281.3017151, 287.1497997, 293.1194622, 299.2132302, 305.4336838, 311.7834567, 318.2652374, 324.8817702, 331.6358565, 338.5303559, 345.5681877, 352.7523315, 360.0858291, 367.5717855, 375.2133702, 383.0138186, 390.9764334, 399.1045859, 407.4017175, 415.8713413, 424.5170432, 433.3424837, 442.3513996, 451.5476051, 460.9349939, 470.5175406, 480.2993023, 490.2844207, 500.4771234, 510.8817259, 521.5026335, 532.3443431, 543.4114449, 554.7086248, 566.2406659, 578.0124508, 590.0289637, 602.2952923, 614.8166301, 627.5982785, 640.6456494, 653.9642668, 667.5597698, 681.4379148, 695.6045776, 710.0657563, 724.8275738, 739.8962801, 755.2782553, 770.980012, 787.0081983, 803.3696005, 820.0711458, 837.1199057, 854.5230985, 872.2880927, 890.4224098, 908.933728, 927.8298847, 947.1188805, 966.8088824, 986.9082269, 1007.425424, 1028.369161, 1049.748305, 1071.571907, 1093.849209, 1116.589641, 1139.802833, 1163.498612, 1187.687011, 1212.378272, 1237.582849, 1263.311413, 1289.574857, 1316.384302, 1343.751098, 1371.686833, 1400.203333, 1429.312674, 1459.02718, 1489.359431, 1520.322271, 1551.928808, 1584.192425, 1617.126783, 1650.745825, 1685.063785, 1720.095194, 1755.854884, 1792.357996, 1829.619984, 1867.656625, 1906.484023, 1946.118619, 1986.577193, 2027.876875, 2070.035151, 2113.069871, 2156.999256, 2201.841905, 2247.616804, 2294.343334, 2342.041279, 2390.730835, 2440.432615, 2491.167664, 2542.957462, 2595.823938, 2649.789474, 2704.87692, 2761.109598, 2818.511318, 2877.106384, 2936.919604, 2997.976303, 3060.302332, 3123.92408, 3188.868484, 3255.163041, 3322.835819, 3391.915472, 3462.431247, 3534.413001, 3607.891209, 3682.896983, 3759.462079, 3837.618916, 3917.400583, 3998.840861, 4081.97423, 4166.83589, 4253.46177, 4341.888547, 4432.153661, 4524.295329, 4618.352565, 4714.36519, 4812.373858, 4912.420063, 5014.546166, 5118.795406, 5225.211921, 5333.840769, 5444.727941, 5557.920388, 5673.466033, 5791.4138, 5911.813626, 6034.716488, 6160.174423, 6288.240549, 6418.969089, 6552.415392, 6688.635959, 6827.688466, 6969.631786, 7114.526018, 7262.432509, 7413.413883, 7567.534063, 7724.858305, 7885.453218, 8049.386798, 8216.728453, 8387.549035, 8561.920869, 8739.917783, 8921.61514, 9107.089869, 9296.420502, 9489.687198, 9686.971786, 9888.357796, 10093.93049, 10303.77692, 10517.98592, 10736.64818, 10959.8563, 11187.70477, 11420.29007, 11657.71067, 11900.0671, 12147.46196, 12400};
            const float Aluminium_eta_values[] = {0.122846741, 0.127663239, 0.132638076, 0.137780447, 0.143101094, 0.148612342, 0.15432813, 0.160264034, 0.16643729, 0.172866814, 0.179573224, 0.186578868, 0.193907856, 0.201586093, 0.209641336, 0.218103237, 0.22700341, 0.236375499, 0.246255243, 0.256680548, 0.267691555, 0.279330687, 0.291642683, 0.304674596, 0.318475743, 0.333097591, 0.348593556, 0.365018681, 0.382429183, 0.400881806, 0.420432981, 0.441137724, 0.463048279, 0.486212467, 0.51067177, 0.536459165, 0.563596803, 0.592093644, 0.62194323, 0.653121813, 0.685587146, 0.719278241, 0.754116468, 0.790008397, 0.826850779, 0.864538125, 0.902973344, 0.942082057, 0.981831304, 1.022253737, 1.063478817, 1.105773347, 1.149594701, 1.195661642, 1.245049224, 1.299315349, 1.360664218, 1.432138653, 1.517790278, 1.622666192, 1.752227133, 1.91052144, 2.096478917, 2.298903888, 2.493347143, 2.645617435, 2.723491279, 2.711037058, 2.615965643, 2.464780829, 2.289721644, 2.116797937, 1.961008257, 1.827896278, 1.717352766, 1.626804727, 1.55306619, 1.493167941, 1.444627315, 1.405468774, 1.374155653, 1.349503292, 1.330599689, 1.316740857, 1.30738074, 1.302093356, 1.300544486, 1.302470563, 1.30766294, 1.315956113, 1.327218867, 1.341347584, 1.358261146, 1.377897027, 1.400208275, 1.425161167, 1.452733355, 1.482912411, 1.515694651, 1.551084195, 1.589092192, 1.629736182, 1.673039567, 1.719031154, 1.767744771, 1.819218933, 1.873496538, 1.930624604, 1.990654023, 2.053639337, 2.119638528, 2.188712809, 2.260926433, 2.336346497, 2.41504275, 2.497087399, 2.582554916, 2.671521832, 2.764066531, 2.860269039, 2.960210796, 3.063974424, 3.171643486, 3.28330223, 3.399035321, 3.518927568, 3.643063627, 3.771527703, 3.904403237, 4.041772575, 4.183716642, 4.33031459, 4.48164345, 4.637777778, 4.798789294, 4.964746527, 5.135714459, 5.311754182, 5.492922566, 5.679271947, 5.870849837, 6.067698667, 6.269855569, 6.477352203, 6.690214636, 6.90846329, 7.132112955, 7.36117289, 7.595647005, 7.835534158, 8.08082854, 8.331520197, 8.587595661, 8.849038716, 9.115831304, 9.387954561, 9.665389996, 9.948120811, 10.23613335, 10.52941867, 10.82797428, 11.13180587, 11.44092929, 11.75537248, 12.07517751, 12.40040264, 12.73112437, 13.06743952, 13.4094672, 13.75735076, 14.11125961, 14.47139089, 14.83797107, 15.21125724, 15.59153835, 15.9791361, 16.37440568, 16.77773621, 17.189551, 17.61030748, 18.04049689, 18.48064377, 18.93130515, 19.39306952, 19.86655559, 20.35241085, 20.85130994, 21.36395281, 21.89106287, 22.43338482, 22.99168257, 23.56673694, 24.15934335, 24.77030949, 25.40045293, 26.05059874, 26.72157707, 27.41422083, 28.1293633, 28.86783587};
            const float Aluminium_k_values[] = {2.287852499, 2.343802006, 2.400694912, 2.458564662, 2.517444987, 2.577369802, 2.638373114, 2.700488929, 2.763751165, 2.828193563, 2.893849609, 2.960752446, 3.028934791, 3.098428846, 3.169266193, 3.241477688, 3.31509333, 3.390142115, 3.466651856, 3.544648979, 3.624158282, 3.705202642, 3.787802684, 3.871976395, 3.957738675, 4.045100838, 4.134070053, 4.224648732, 4.316833892, 4.410616489, 4.505980791, 4.602903816, 4.701354915, 4.801295587, 4.902679633, 5.005453778, 5.109558891, 5.214931939, 5.321508811, 5.429228102, 5.538035914, 5.647891685, 5.758774969, 5.870693043, 5.983689124, 6.09785093, 6.213319256, 6.33029617, 6.449052356, 6.569932967, 6.693361057, 6.819837024, 6.949931286, 7.084264998, 7.223469076, 7.36810319, 7.518500731, 7.67447901, 7.834814986, 7.996354105, 8.152676478, 8.292597883, 8.39965903, 8.454776754, 8.443684434, 8.367043414, 8.246450066, 8.119920696, 8.027720599, 7.99728212, 8.036555493, 8.137837134, 8.286476761, 8.467966442, 8.671111225, 8.888371717, 9.115070964, 9.348463259, 9.587009605, 9.829893881, 10.07672224, 10.32734302, 10.58174086, 10.8399752, 11.10214486, 11.36836787, 11.63877031, 11.91348017, 12.1926243, 12.47632702, 12.76470962, 13.05789048, 13.35598526, 13.65910735, 13.96736821, 14.28087779, 14.59974483, 14.92407714, 15.2539818, 15.58956535, 15.93093394, 16.27819335, 16.63144911, 16.99080652, 17.3563706, 17.72824614, 18.10653765, 18.4913493, 18.88278488, 19.28094774, 19.68594069, 20.09786598, 20.51682519, 20.94291914, 21.37624782, 21.81691034, 22.2650048, 22.72062824, 23.18387656, 23.65484448, 24.13362543, 24.62031155, 25.1149936, 25.61776098, 26.12870166, 26.64790222, 27.17544786, 27.71142243, 28.25590848, 28.80898738, 29.37073939, 29.94124384, 30.52057931, 31.10882383, 31.70605512, 32.31235095, 32.92778941, 33.55244938, 34.18641091, 34.82975576, 35.48256794, 36.14493431, 36.81694527, 37.49869547, 38.19028457, 38.89181812, 39.6034084, 40.32517536, 41.0572476, 41.79976337, 42.55287158, 43.31673287, 44.09152061, 44.877422, 45.67463899, 46.48338931, 47.30390732, 48.1364449, 48.9812721, 49.83867781, 50.70897018, 51.592477, 52.4895458, 53.40054382, 54.3258578, 55.26589347, 56.22107493, 57.19184373, 58.17865772, 59.18198974, 60.20232601, 61.24016436, 62.29601226, 63.37038465, 64.46380166, 65.57678612, 66.709861, 67.86354682, 69.03835893, 70.23480477, 71.4533812, 72.69457179, 73.95884422, 75.24664775, 76.55841077, 77.89453853, 79.25541095, 80.64138069, 82.05277128, 83.4898755, 84.95295395, 86.44223373, 87.95790747, 89.50013235, 91.06902946, 92.66468328, 94.28714131, 95.93641391, 97.6124743, 99.31525862};
            const Data Aluminium_eta = {
                DistributionType::Irregular,
                200, Aluminium_lambdas[0], Aluminium_lambdas[199],
                Aluminium_lambdas,
                Aluminium_eta_values
            };
            const Data Aluminium_k = {
                DistributionType::Irregular,
                200, Aluminium_lambdas[0], Aluminium_lambdas[199],
                Aluminium_lambdas,
                Aluminium_k_values
            };
            
            const float Copper_lambdas[] = {206.6, 210.8950832, 215.2794584, 219.7549821, 224.323549, 228.9870936, 233.7475903, 238.6070547, 243.5675442, 248.6311593, 253.8000437, 259.0763859, 264.4624199, 269.9604262, 275.5727325, 281.3017151, 287.1497997, 293.1194622, 299.2132302, 305.4336838, 311.7834567, 318.2652374, 324.8817702, 331.6358565, 338.5303559, 345.5681877, 352.7523315, 360.0858291, 367.5717855, 375.2133702, 383.0138186, 390.9764334, 399.1045859, 407.4017175, 415.8713413, 424.5170432, 433.3424837, 442.3513996, 451.5476051, 460.9349939, 470.5175406, 480.2993023, 490.2844207, 500.4771234, 510.8817259, 521.5026335, 532.3443431, 543.4114449, 554.7086248, 566.2406659, 578.0124508, 590.0289637, 602.2952923, 614.8166301, 627.5982785, 640.6456494, 653.9642668, 667.5597698, 681.4379148, 695.6045776, 710.0657563, 724.8275738, 739.8962801, 755.2782553, 770.980012, 787.0081983, 803.3696005, 820.0711458, 837.1199057, 854.5230985, 872.2880927, 890.4224098, 908.933728, 927.8298847, 947.1188805, 966.8088824, 986.9082269, 1007.425424, 1028.369161, 1049.748305, 1071.571907, 1093.849209, 1116.589641, 1139.802833, 1163.498612, 1187.687011, 1212.378272, 1237.582849, 1263.311413, 1289.574857, 1316.384302, 1343.751098, 1371.686833, 1400.203333, 1429.312674, 1459.02718, 1489.359431, 1520.322271, 1551.928808, 1584.192425, 1617.126783, 1650.745825, 1685.063785, 1720.095194, 1755.854884, 1792.357996, 1829.619984, 1867.656625, 1906.484023, 1946.118619, 1986.577193, 2027.876875, 2070.035151, 2113.069871, 2156.999256, 2201.841905, 2247.616804, 2294.343334, 2342.041279, 2390.730835, 2440.432615, 2491.167664, 2542.957462, 2595.823938, 2649.789474, 2704.87692, 2761.109598, 2818.511318, 2877.106384, 2936.919604, 2997.976303, 3060.302332, 3123.92408, 3188.868484, 3255.163041, 3322.835819, 3391.915472, 3462.431247, 3534.413001, 3607.891209, 3682.896983, 3759.462079, 3837.618916, 3917.400583, 3998.840861, 4081.97423, 4166.83589, 4253.46177, 4341.888547, 4432.153661, 4524.295329, 4618.352565, 4714.36519, 4812.373858, 4912.420063, 5014.546166, 5118.795406, 5225.211921, 5333.840769, 5444.727941, 5557.920388, 5673.466033, 5791.4138, 5911.813626, 6034.716488, 6160.174423, 6288.240549, 6418.969089, 6552.415392, 6688.635959, 6827.688466, 6969.631786, 7114.526018, 7262.432509, 7413.413883, 7567.534063, 7724.858305, 7885.453218, 8049.386798, 8216.728453, 8387.549035, 8561.920869, 8739.917783, 8921.61514, 9107.089869, 9296.420502, 9489.687198, 9686.971786, 9888.357796, 10093.93049, 10303.77692, 10517.98592, 10736.64818, 10959.8563, 11187.70477, 11420.29007, 11657.71067, 11900.0671, 12147.46196, 12400};
            const float Copper_eta_values[] = {1.302970329, 1.321845043, 1.343298322, 1.366721758, 1.391383123, 1.416474776, 1.441154422, 1.464577071, 1.485918389, 1.504390482, 1.519251755, 1.529813112, 1.535443627, 1.53557993, 1.529744867, 1.517582034, 1.498912845, 1.473820526, 1.442759137, 1.406673263, 1.367094964, 1.326164098, 1.286511379, 1.250972933, 1.222176823, 1.202119493, 1.191869428, 1.191473141, 1.200045329, 1.215968198, 1.237123251, 1.26110683, 1.285409417, 1.307556351, 1.325215144, 1.33627667, 1.338917578, 1.331651107, 1.313373488, 1.283412757, 1.241585146, 1.188259356, 1.124418933, 1.051697516, 0.972346259, 0.88909176, 0.804872783, 0.722502526, 0.644353437, 0.572158989, 0.506969373, 0.449231745, 0.398933668, 0.35575482, 0.319195521, 0.288671857, 0.263579512, 0.243333026, 0.227387652, 0.215249658, 0.206479378, 0.200689954, 0.197543682, 0.196747209, 0.198046316, 0.201220771, 0.206079488, 0.212456139, 0.220205271, 0.229198942, 0.239323847, 0.250478902, 0.262573238, 0.275524553, 0.289257784, 0.303704036, 0.318799744, 0.334486009, 0.350708099, 0.367415061, 0.384559434, 0.402097036, 0.419986807, 0.438190699, 0.45667359, 0.475403227, 0.494350169, 0.513487754, 0.532792059, 0.55224186, 0.571818594, 0.591506313, 0.611291642, 0.631163719, 0.651114145, 0.67113692, 0.691228379, 0.711387126, 0.731613964, 0.751911826, 0.772285703, 0.792742576, 0.813291344, 0.833942762, 0.85470937, 0.875605434, 0.896646889, 0.917851286, 0.939237734, 0.960826867, 0.98264079, 1.004703055, 1.027038621, 1.049673835, 1.07263641, 1.095955408, 1.119661231, 1.143785621, 1.168361652, 1.193423745, 1.219007672, 1.245150575, 1.271890987, 1.299268853, 1.327325567, 1.356103999, 1.385648542, 1.416005146, 1.447221376, 1.479346456, 1.51243133, 1.546528721, 1.581693195, 1.617981229, 1.655451289, 1.694163898, 1.734181726, 1.775569666, 1.818394931, 1.862727142, 1.908638425, 1.956203514, 2.005499857, 2.05660772, 2.109610308, 2.164593875, 2.221647853, 2.280864973, 2.342341399, 2.406176861, 2.472474794, 2.541342486, 2.612891222, 2.687236439, 2.764497885, 2.844799779, 2.928270981, 3.015045162, 3.105260979, 3.199062262, 3.296598195, 3.398023506, 3.503498669, 3.613190095, 3.727270344, 3.84591833, 3.969319535, 4.097666227, 4.231157679, 4.370000399, 4.514408351, 4.664603194, 4.820814513, 4.983280057, 5.152245979, 5.327967077, 5.510707036, 5.700738673, 5.898344179, 6.103815362, 6.31745389, 6.539571528, 6.770490377, 7.010543108, 7.260073185, 7.519435092, 7.788994547, 8.069128705, 8.36022636, 8.662688126, 8.976926613, 9.303366584, 9.642445097, 9.994611632, 10.36032819, 10.74006939, 11.1343225, 11.54358751, 11.96837709, 12.40921661};
            const float Copper_k_values[] = {1.682425654, 1.699970423, 1.715815681, 1.729241792, 1.739708185, 1.746858623, 1.750515622, 1.750668434, 1.747458358, 1.741164483, 1.73219245, 1.721068414, 1.708439927, 1.695084632, 1.681926096, 1.670053358, 1.660736567, 1.65542545, 1.655711137, 1.663227877, 1.679474968, 1.705559196, 1.741898781, 1.787978811, 1.842268004, 1.90236055, 1.965308376, 2.028029, 2.087668182, 2.141850678, 2.188812964, 2.227445014, 2.257274368, 2.278418753, 2.291524371, 2.297700015, 2.29845269, 2.29562734, 2.291350465, 2.287973967, 2.28801098, 2.29405026, 2.308632212, 2.334073275, 2.372243058, 2.424332252, 2.490684016, 2.570765456, 2.663308227, 2.766572255, 2.878639584, 2.997655462, 3.121979357, 3.250250944, 3.381396327, 3.514601101, 3.649269861, 3.784983778, 3.921461964, 4.058528772, 4.196087293, 4.334098467, 4.472564961, 4.611518919, 4.751012804, 4.891112656, 5.031893225, 5.173434531, 5.315819515, 5.459132493, 5.60345821, 5.748881327, 5.895486203, 6.043356888, 6.192577242, 6.343231141, 6.495402704, 6.649176546, 6.804638014, 6.961873396, 7.120970113, 7.282016867, 7.445103761, 7.610322391, 7.777765898, 7.947529001, 8.11970801, 8.294400812, 8.471706846, 8.65172707, 8.834563911, 9.020321221, 9.20910422, 9.401019444, 9.596174698, 9.794679, 9.996642545, 10.20217666, 10.41139379, 10.62440743, 10.84133217, 11.06228361, 11.28737844, 11.51673437, 11.75047016, 11.98870568, 12.23156185, 12.47916075, 12.73162561, 12.98908086, 13.25165215, 13.51946644, 13.79265201, 14.07133855, 14.35565718, 14.64574053, 14.94172281, 15.24373985, 15.55192916, 15.86643003, 16.18738357, 16.51493277, 16.84922259, 17.1904, 17.53861409, 17.89401608, 18.25675941, 18.62699984, 19.00489546, 19.39060677, 19.78429678, 20.18613102, 20.59627764, 21.01490744, 21.44219395, 21.87831347, 22.32344516, 22.77777103, 23.24147605, 23.7147482, 24.19777845, 24.6907609, 25.19389275, 25.70737438, 26.23140938, 26.76620457, 27.31197006, 27.86891928, 28.43726896, 29.01723923, 29.60905358, 30.21293889, 30.82912546, 31.45784702, 32.0993407, 32.75384705, 33.42161006, 34.10287711, 34.79789896, 35.50692974, 36.23022691, 36.96805124, 37.72066674, 38.48834062, 39.27134324, 40.06994804, 40.88443145, 41.7150728, 42.56215426, 43.42596068, 44.3067795, 45.20490065, 46.12061633, 47.05422093, 48.00601082, 48.97628418, 49.96534079, 50.97348185, 52.00100969, 53.0482276, 54.11543949, 55.20294968, 56.31106253, 57.44008219, 58.5903122, 59.76205517, 60.95561237, 62.17128336, 63.40936553, 64.67015369, 65.95393957, 67.26101132, 68.59165304, 69.94614419, 71.32475905, 72.72776615, 74.1554276, 75.60799854, 77.0857264, 78.58885029};
            const Data Copper_eta = {
                DistributionType::Irregular,
                200, Copper_lambdas[0], Copper_lambdas[199],
                Copper_lambdas,
                Copper_eta_values
            };
            const Data Copper_k = {
                DistributionType::Irregular,
                200, Copper_lambdas[0], Copper_lambdas[199],
                Copper_lambdas,
                Copper_k_values
            };
            
            const float Gold_lambdas[] = {206.6, 210.8950832, 215.2794584, 219.7549821, 224.323549, 228.9870936, 233.7475903, 238.6070547, 243.5675442, 248.6311593, 253.8000437, 259.0763859, 264.4624199, 269.9604262, 275.5727325, 281.3017151, 287.1497997, 293.1194622, 299.2132302, 305.4336838, 311.7834567, 318.2652374, 324.8817702, 331.6358565, 338.5303559, 345.5681877, 352.7523315, 360.0858291, 367.5717855, 375.2133702, 383.0138186, 390.9764334, 399.1045859, 407.4017175, 415.8713413, 424.5170432, 433.3424837, 442.3513996, 451.5476051, 460.9349939, 470.5175406, 480.2993023, 490.2844207, 500.4771234, 510.8817259, 521.5026335, 532.3443431, 543.4114449, 554.7086248, 566.2406659, 578.0124508, 590.0289637, 602.2952923, 614.8166301, 627.5982785, 640.6456494, 653.9642668, 667.5597698, 681.4379148, 695.6045776, 710.0657563, 724.8275738, 739.8962801, 755.2782553, 770.980012, 787.0081983, 803.3696005, 820.0711458, 837.1199057, 854.5230985, 872.2880927, 890.4224098, 908.933728, 927.8298847, 947.1188805, 966.8088824, 986.9082269, 1007.425424, 1028.369161, 1049.748305, 1071.571907, 1093.849209, 1116.589641, 1139.802833, 1163.498612, 1187.687011, 1212.378272, 1237.582849, 1263.311413, 1289.574857, 1316.384302, 1343.751098, 1371.686833, 1400.203333, 1429.312674, 1459.02718, 1489.359431, 1520.322271, 1551.928808, 1584.192425, 1617.126783, 1650.745825, 1685.063785, 1720.095194, 1755.854884, 1792.357996, 1829.619984, 1867.656625, 1906.484023, 1946.118619, 1986.577193, 2027.876875, 2070.035151, 2113.069871, 2156.999256, 2201.841905, 2247.616804, 2294.343334, 2342.041279, 2390.730835, 2440.432615, 2491.167664, 2542.957462, 2595.823938, 2649.789474, 2704.87692, 2761.109598, 2818.511318, 2877.106384, 2936.919604, 2997.976303, 3060.302332, 3123.92408, 3188.868484, 3255.163041, 3322.835819, 3391.915472, 3462.431247, 3534.413001, 3607.891209, 3682.896983, 3759.462079, 3837.618916, 3917.400583, 3998.840861, 4081.97423, 4166.83589, 4253.46177, 4341.888547, 4432.153661, 4524.295329, 4618.352565, 4714.36519, 4812.373858, 4912.420063, 5014.546166, 5118.795406, 5225.211921, 5333.840769, 5444.727941, 5557.920388, 5673.466033, 5791.4138, 5911.813626, 6034.716488, 6160.174423, 6288.240549, 6418.969089, 6552.415392, 6688.635959, 6827.688466, 6969.631786, 7114.526018, 7262.432509, 7413.413883, 7567.534063, 7724.858305, 7885.453218, 8049.386798, 8216.728453, 8387.549035, 8561.920869, 8739.917783, 8921.61514, 9107.089869, 9296.420502, 9489.687198, 9686.971786, 9888.357796, 10093.93049, 10303.77692, 10517.98592, 10736.64818, 10959.8563, 11187.70477, 11420.29007, 11657.71067, 11900.0671, 12147.46196, 12400};
            const float Gold_eta_values[] = {1.252233208, 1.288605017, 1.320539863, 1.348883362, 1.374628429, 1.398826114, 1.422485501, 1.44647562, 1.471443129, 1.497756689, 1.525483411, 1.554396291, 1.584006393, 1.613610812, 1.642347331, 1.669248583, 1.693291661, 1.71344306, 1.728703166, 1.738158646, 1.741053695, 1.73689001, 1.725557795, 1.70748408, 1.68376051, 1.656186961, 1.627155639, 1.599326336, 1.57512082, 1.556166255, 1.542873299, 1.53428803, 1.528235639, 1.521666028, 1.511076211, 1.492912261, 1.463903818, 1.421328741, 1.363237223, 1.288685306, 1.198031282, 1.09330562, 0.978523166, 0.859575064, 0.743288882, 0.635790656, 0.54109335, 0.460739155, 0.394373918, 0.340593025, 0.297605603, 0.263621057, 0.237028009, 0.216453835, 0.200765475, 0.189045342, 0.180559281, 0.174724391, 0.171079979, 0.169262728, 0.168986132, 0.170023837, 0.172196354, 0.175360582, 0.179401637, 0.184226512, 0.189759203, 0.195936969, 0.202707475, 0.210026622, 0.217856883, 0.226166054, 0.234926294, 0.244113394, 0.253706232, 0.263686345, 0.274037609, 0.284745995, 0.295799382, 0.30718741, 0.318901374, 0.330934142, 0.343280083, 0.355935028, 0.368896223, 0.382162307, 0.395733287, 0.409610522, 0.423796707, 0.438295869, 0.453113354, 0.468255825, 0.483731256, 0.499548932, 0.515719447, 0.5322547, 0.549167906, 0.566473588, 0.584187588, 0.602327069, 0.620910525, 0.639957786, 0.65949003, 0.679529796, 0.700100994, 0.721228925, 0.742940299, 0.765263253, 0.788227375, 0.811863727, 0.836204876, 0.861284925, 0.887139538, 0.913805986, 0.941323178, 0.969731703, 0.99907388, 1.029393796, 1.060737362, 1.093152366, 1.126688525, 1.161397547, 1.197333194, 1.234551345, 1.273110064, 1.313069677, 1.354492838, 1.397444616, 1.44199257, 1.488206836, 1.536160215, 1.585928262, 1.637589381, 1.691224924, 1.746919289, 1.804760024, 1.864837934, 1.927247191, 1.992085446, 2.059453947, 2.129457653, 2.202205359, 2.277809819, 2.356387871, 2.438060571, 2.522953315, 2.611195982, 2.702923063, 2.798273801, 2.897392328, 3.000427804, 3.107534559, 3.218872234, 3.33460592, 3.454906301, 3.579949795, 3.709918691, 3.84500129, 3.985392036, 4.131291656, 4.282907281, 4.44045258, 4.604147874, 4.774220257, 4.950903698, 5.134439152, 5.325074644, 5.523065358, 5.728673713, 5.942169419, 6.163829533, 6.393938493, 6.632788137, 6.880677714, 7.137913863, 7.40481059, 7.681689207, 7.968878265, 8.266713453, 8.575537475, 8.895699902, 9.227556996, 9.571471502, 9.927812414, 10.2969547, 10.67927901, 11.07517133, 11.48502261, 11.90922836, 12.34818819, 12.80230534, 13.27198615, 13.75763948, 14.25967614, 14.7785082, 15.31454836, 15.8682092, 16.43990241, 17.03003802, 17.63902359};
            const float Gold_k_values[] = {1.985916564, 1.975347792, 1.965977779, 1.958537185, 1.953474799, 1.950920549, 1.950679794, 1.952262268, 1.954942728, 1.957844209, 1.960031123, 1.960599229, 1.95875241, 1.95386084, 1.94549986, 1.933472781, 1.917823213, 1.898843489, 1.877084702, 1.853370482, 1.828810249, 1.804798493, 1.782976523, 1.765126293, 1.752969357, 1.747866314, 1.750458228, 1.760351216, 1.775982617, 1.794774542, 1.813569301, 1.829216179, 1.839129272, 1.841684565, 1.836416515, 1.824046326, 1.806403611, 1.786300322, 1.767395654, 1.754057295, 1.751171983, 1.763784716, 1.796397997, 1.851891923, 1.930467715, 2.029415843, 2.144082909, 2.269391063, 2.400972842, 2.535599919, 2.671127755, 2.806256887, 2.940283309, 3.07289809, 3.204042941, 3.33381143, 3.462383428, 3.589982618, 3.716849636, 3.843225689, 3.969343096, 4.095420338, 4.221659993, 4.348248437, 4.475356583, 4.603141181, 4.731746355, 4.861305208, 4.991941357, 5.123770363, 5.25690101, 5.391436431, 5.527475099, 5.665111665, 5.804437694, 5.945542278, 6.088512566, 6.233434214, 6.38039176, 6.529468952, 6.680749021, 6.834314908, 6.99024947, 7.148635645, 7.309556594, 7.473095828, 7.63933731, 7.808365552, 7.980265689, 8.155123553, 8.333025727, 8.514059609, 8.698313453, 8.885876415, 9.076838595, 9.271291073, 9.469325946, 9.671036358, 9.876516538, 10.08586183, 10.2991687, 10.51653483, 10.73805907, 10.96384152, 11.19398353, 11.42858776, 11.66775818, 11.91160013, 12.1602203, 12.41372683, 12.67222929, 12.93583869, 13.20466759, 13.47883005, 13.7584417, 14.04361975, 14.33448303, 14.631152, 14.9337488, 15.24239726, 15.55722291, 15.87835304, 16.2059167, 16.54004468, 16.88086962, 17.22852594, 17.58314989, 17.94487957, 18.31385492, 18.69021773, 19.07411165, 19.46568222, 19.86507679, 20.27244461, 20.68793673, 21.11170607, 21.54390734, 21.98469706, 22.43423351, 22.89267672, 23.3601884, 23.83693195, 24.32307238, 24.81877625, 25.32421164, 25.83954806, 26.36495641, 26.90060885, 27.44667876, 28.00334063, 28.57076994, 29.14914309, 29.73863723, 30.33943015, 30.95170015, 31.57562587, 32.21138617, 32.85915989, 33.51912573, 34.19146202, 34.87634652, 35.57395623, 36.28446709, 37.00805381, 37.74488956, 38.49514575, 39.25899169, 40.0365943, 40.82811785, 41.63372359, 42.45356939, 43.28780945, 44.13659389, 45.00006836, 45.87837369, 46.77164546, 47.68001357, 48.60360184, 49.54252757, 50.49690105, 51.46682519, 52.45239495, 53.45369697, 54.47080905, 55.50379968, 56.55272755, 57.61764114, 58.69857818, 59.79556523, 60.90861721, 62.03773697, 63.18291487, 64.34412835, 65.52134156, 66.71450498, 67.92355514, 69.14841423, 70.38898992, 71.64517507, 72.91684758};
            const Data Gold_eta = {
                DistributionType::Irregular,
                200, Gold_lambdas[0], Gold_lambdas[199],
                Gold_lambdas,
                Gold_eta_values
            };
            const Data Gold_k = {
                DistributionType::Irregular,
                200, Gold_lambdas[0], Gold_lambdas[199],
                Gold_lambdas,
                Gold_k_values
            };
            
            const float Iron_lambdas[] = {188, 192, 195, 199, 203, 207, 212, 216, 221, 226, 231, 237, 243, 249, 255, 262, 269, 276, 284, 292, 301, 311, 320, 332, 342, 354, 368, 381, 397, 413, 431, 451, 471, 496, 521, 549, 582, 617, 659, 704, 756, 821, 892, 984, 1088, 1216, 1393, 1610, 1937};
            const float Iron_eta_values[] = {1.29, 1.35, 1.42, 1.45, 1.47, 1.49, 1.47, 1.47, 1.47, 1.47, 1.48, 1.48, 1.5, 1.51, 1.53, 1.56, 1.59, 1.62, 1.64, 1.65, 1.67, 1.69, 1.74, 1.78, 1.85, 1.93, 2.02, 2.12, 2.24, 2.35, 2.48, 2.59, 2.67, 2.74, 2.86, 2.95, 2.94, 2.88, 2.92, 2.86, 2.87, 2.94, 2.96, 2.92, 2.97, 3.03, 3.09, 3.11, 3.17};
            const float Iron_k_values[] = {1.35, 1.37, 1.39, 1.4, 1.4, 1.41, 1.43, 1.44, 1.47, 1.49, 1.53, 1.57, 1.61, 1.66, 1.7, 1.75, 1.79, 1.84, 1.88, 1.94, 2, 2.06, 2.12, 2.19, 2.27, 2.35, 2.43, 2.5, 2.58, 2.65, 2.71, 2.77, 2.82, 2.88, 2.91, 2.93, 2.99, 3.05, 3.1, 3.19, 3.28, 3.39, 3.56, 3.79, 4.06, 4.39, 4.83, 5.39, 6.12};
            const Data Iron_eta = {
                DistributionType::Irregular,
                49, Iron_lambdas[0], Iron_lambdas[48],
                Iron_lambdas,
                Iron_eta_values
            };
            const Data Iron_k = {
                DistributionType::Irregular,
                49, Iron_lambdas[0], Iron_lambdas[48],
                Iron_lambdas,
                Iron_k_values
            };
            
            const float Lead_lambdas[] = {450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650, 660, 680, 700, 720, 740, 750, 760, 780, 800, 820, 850, 880, 900, 920, 950, 980, 1000, 1050, 1100, 1150, 1200, 1250, 1300, 1350, 1400, 1450, 1500, 1550, 1600, 1700, 1800, 1900, 2000, 2100, 2200, 2300, 2400, 2500, 2550, 2600, 3000, 3500, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000};
            const float Lead_eta_values[] = {1.44, 1.54, 1.58, 1.62, 1.68, 1.7, 1.74, 1.75, 1.78, 1.81, 1.83, 1.87, 1.87, 1.9, 1.91, 1.91, 1.94, 1.94, 1.95, 1.94, 1.91, 1.89, 1.85, 1.78, 1.71, 1.83, 1.6, 1.57, 1.52, 1.5, 1.47, 1.44, 1.41, 1.4, 1.38, 1.38, 1.38, 1.38, 1.38, 1.4, 1.41, 1.44, 1.48, 1.5, 1.52, 1.58, 1.6, 1.64, 1.69, 1.77, 1.89, 2.05, 2.18, 2.32, 2.47, 2.63, 2.84, 3.03, 3.22, 3.34, 3.45, 4.27, 5.39, 6.58, 9.04, 11.7, 14.1, 16.4, 18.7, 21, 23.2, 24.6};
            const float Lead_k_values[] = {3.18, 3.2, 3.23, 3.25, 3.28, 3.3, 3.31, 3.34, 3.36, 3.37, 3.4, 3.41, 3.43, 3.43, 3.44, 3.45, 3.46, 3.47, 3.48, 3.49, 3.51, 3.51, 3.53, 3.57, 3.64, 3.73, 3.78, 3.84, 3.96, 4.09, 4.18, 4.35, 4.56, 4.68, 4.8, 4.99, 5.16, 5.32, 5.62, 5.98, 6.31, 6.59, 6.93, 7.23, 7.48, 7.74, 8.01, 8.3, 8.58, 8.9, 9.47, 10.1, 10.7, 11.2, 11.7, 12.2, 12.8, 13.2, 13.9, 14.1, 14.4, 16.4, 18.6, 20.8, 24.8, 28.1, 30.9, 33.6, 35.8, 37.4, 39.2, 40.5};
            const Data Lead_eta = {
                DistributionType::Irregular,
                72, Lead_lambdas[0], Lead_lambdas[71],
                Lead_lambdas,
                Lead_eta_values
            };
            const Data Lead_k = {
                DistributionType::Irregular,
                72, Lead_lambdas[0], Lead_lambdas[71],
                Lead_lambdas,
                Lead_k_values
            };
            
            const float Mercury_lambdas[] = {63.58, 65.25, 67.02, 68.88, 70.85, 72.93, 75.14, 77.49, 79.99, 82.66, 85.51, 88.56, 91.84, 95.37, 99.19, 103.32, 107.81, 112.71, 114.8, 116.97, 119.22, 121.55, 123.98, 126.51, 129.15, 131.9, 134.77, 137.76, 140.89, 144.17, 147.6, 151.2, 154.98, 158.95, 163.14, 167.55, 172.2, 177.12, 179.69, 182.33, 185.05, 187.85, 190.74, 193.73, 196.8, 199.97, 206.64, 213.77, 221.4, 229.6, 238.43, 247.97, 258.3, 269.53, 281.78, 295.2, 309.96, 326.27, 344.4, 364.66, 387.45, 413.28, 442.8, 476.86, 516.6, 563.56, 619.92, 688.8, 774.9, 885.6, 1033.2, 1239.84, 1549.8, 2066.4, 3099.6, 6199.21};
            const float Mercury_eta_values[] = {1.20846, 1.20004, 1.19493, 1.19073, 1.18399, 1.1774, 1.16958, 1.15865, 1.1463, 1.13509, 1.1251, 1.1153, 1.10417, 1.09246, 1.07841, 1.06391, 1.05005, 1.0395, 1.03857, 1.0413, 1.04545, 1.05405, 1.06152, 1.06094, 1.04397, 1.00864, 0.98779, 0.97457, 0.96496, 0.95609, 0.95275, 0.95194, 0.946, 0.92904, 0.8927, 0.81658, 0.71715, 0.58506, 0.50958, 0.4588, 0.4376, 0.43614, 0.42769, 0.4123, 0.39938, 0.38978, 0.38613, 0.38584, 0.38658, 0.39348, 0.40109, 0.41398, 0.43087, 0.45157, 0.47636, 0.50656, 0.54187, 0.58934, 0.64425, 0.71303, 0.79824, 0.898, 1.02698, 1.186, 1.38332, 1.62088, 1.90988, 2.28417, 2.74611, 3.3238, 4.05007, 4.9614, 6.08732, 7.57453, 9.7411, 13.9816};
            const float Mercury_k_values[] = {0.36385, 0.3662, 0.36722, 0.36721, 0.36584, 0.36644, 0.36731, 0.36806, 0.37416, 0.38266, 0.39352, 0.40361, 0.41615, 0.42949, 0.44505, 0.46691, 0.49093, 0.52333, 0.53631, 0.55027, 0.56148, 0.56923, 0.56711, 0.55658, 0.54072, 0.54777, 0.56844, 0.58846, 0.60676, 0.62442, 0.63815, 0.64552, 0.639, 0.62323, 0.5965, 0.57385, 0.58405, 0.61668, 0.67614, 0.75545, 0.83582, 0.89823, 0.94927, 1.00194, 1.05826, 1.11845, 1.23211, 1.34122, 1.45377, 1.56934, 1.68667, 1.80565, 1.92864, 2.05838, 2.19475, 2.34128, 2.50152, 2.66483, 2.85991, 3.0735, 3.29351, 3.53785, 3.80193, 4.08981, 4.40608, 4.7505, 5.14953, 5.58189, 6.05402, 6.55726, 7.08259, 7.643, 8.31237, 9.19529, 10.6456, 14.2652};
            const Data Mercury_eta = {
                DistributionType::Irregular,
                76, Mercury_lambdas[0], Mercury_lambdas[75],
                Mercury_lambdas,
                Mercury_eta_values
            };
            const Data Mercury_k = {
                DistributionType::Irregular,
                76, Mercury_lambdas[0], Mercury_lambdas[75],
                Mercury_lambdas,
                Mercury_k_values
            };
            
            const float Platinum_lambdas[] = {206.6, 210.8950832, 215.2794584, 219.7549821, 224.323549, 228.9870936, 233.7475903, 238.6070547, 243.5675442, 248.6311593, 253.8000437, 259.0763859, 264.4624199, 269.9604262, 275.5727325, 281.3017151, 287.1497997, 293.1194622, 299.2132302, 305.4336838, 311.7834567, 318.2652374, 324.8817702, 331.6358565, 338.5303559, 345.5681877, 352.7523315, 360.0858291, 367.5717855, 375.2133702, 383.0138186, 390.9764334, 399.1045859, 407.4017175, 415.8713413, 424.5170432, 433.3424837, 442.3513996, 451.5476051, 460.9349939, 470.5175406, 480.2993023, 490.2844207, 500.4771234, 510.8817259, 521.5026335, 532.3443431, 543.4114449, 554.7086248, 566.2406659, 578.0124508, 590.0289637, 602.2952923, 614.8166301, 627.5982785, 640.6456494, 653.9642668, 667.5597698, 681.4379148, 695.6045776, 710.0657563, 724.8275738, 739.8962801, 755.2782553, 770.980012, 787.0081983, 803.3696005, 820.0711458, 837.1199057, 854.5230985, 872.2880927, 890.4224098, 908.933728, 927.8298847, 947.1188805, 966.8088824, 986.9082269, 1007.425424, 1028.369161, 1049.748305, 1071.571907, 1093.849209, 1116.589641, 1139.802833, 1163.498612, 1187.687011, 1212.378272, 1237.582849, 1263.311413, 1289.574857, 1316.384302, 1343.751098, 1371.686833, 1400.203333, 1429.312674, 1459.02718, 1489.359431, 1520.322271, 1551.928808, 1584.192425, 1617.126783, 1650.745825, 1685.063785, 1720.095194, 1755.854884, 1792.357996, 1829.619984, 1867.656625, 1906.484023, 1946.118619, 1986.577193, 2027.876875, 2070.035151, 2113.069871, 2156.999256, 2201.841905, 2247.616804, 2294.343334, 2342.041279, 2390.730835, 2440.432615, 2491.167664, 2542.957462, 2595.823938, 2649.789474, 2704.87692, 2761.109598, 2818.511318, 2877.106384, 2936.919604, 2997.976303, 3060.302332, 3123.92408, 3188.868484, 3255.163041, 3322.835819, 3391.915472, 3462.431247, 3534.413001, 3607.891209, 3682.896983, 3759.462079, 3837.618916, 3917.400583, 3998.840861, 4081.97423, 4166.83589, 4253.46177, 4341.888547, 4432.153661, 4524.295329, 4618.352565, 4714.36519, 4812.373858, 4912.420063, 5014.546166, 5118.795406, 5225.211921, 5333.840769, 5444.727941, 5557.920388, 5673.466033, 5791.4138, 5911.813626, 6034.716488, 6160.174423, 6288.240549, 6418.969089, 6552.415392, 6688.635959, 6827.688466, 6969.631786, 7114.526018, 7262.432509, 7413.413883, 7567.534063, 7724.858305, 7885.453218, 8049.386798, 8216.728453, 8387.549035, 8561.920869, 8739.917783, 8921.61514, 9107.089869, 9296.420502, 9489.687198, 9686.971786, 9888.357796, 10093.93049, 10303.77692, 10517.98592, 10736.64818, 10959.8563, 11187.70477, 11420.29007, 11657.71067, 11900.0671, 12147.46196, 12400};
            const float Platinum_eta_values[] = {1.774031472, 1.74089031, 1.706451669, 1.671533808, 1.636961496, 1.603542428, 1.572038025, 1.543131696, 1.517399075, 1.495284981, 1.477090786, 1.462973612, 1.452956361, 1.446945783, 1.444754996, 1.446127139, 1.450757681, 1.458313928, 1.468451113, 1.480825122, 1.495102178, 1.510965996, 1.528122906, 1.546305383, 1.565274354, 1.584820567, 1.604765216, 1.624959994, 1.645286672, 1.665656291, 1.686008015, 1.706307708, 1.726546244, 1.746737609, 1.766916807, 1.787137603, 1.80747014, 1.827998461, 1.848817961, 1.870032819, 1.89175344, 1.91409394, 1.937169708, 1.961095075, 1.985981123, 2.011933638, 2.039051242, 2.067423695, 2.09713039, 2.128239037, 2.160804538, 2.194868047, 2.230456233, 2.267580731, 2.3062378, 2.346408197, 2.388057273, 2.431135323, 2.475578201, 2.521308238, 2.568235469, 2.616259227, 2.665270097, 2.715152281, 2.765786367, 2.817052541, 2.868834218, 2.921022108, 2.973518688, 3.026243062, 3.079136148, 3.132166156, 3.185334252, 3.238680304, 3.292288577, 3.346293167, 3.400882949, 3.456305707, 3.512871041, 3.570951539, 3.630981565, 3.693452871, 3.758906108, 3.827917151, 3.901077086, 3.978964719, 4.062110652, 4.150952445, 4.245781232, 4.346681442, 4.453467072, 4.565620003, 4.682237909, 4.802000759, 4.923165083, 5.04359348, 5.160823048, 5.272170935, 5.374869013, 5.466214354, 5.543719014, 5.605242657, 5.649094656, 5.674097759, 5.679611684, 5.665520791, 5.632194032, 5.580427281, 5.511377882, 5.426499392, 5.327481643, 5.216198138, 5.094660028, 4.964973905, 4.829299823, 4.68980633, 4.548620958, 4.407777042, 4.26916027, 4.134460185, 4.005132197, 3.882374461, 3.767121552, 3.660054128, 3.561621513, 3.472072902, 3.391492682, 3.319836066, 3.256962251, 3.202663439, 3.156689036, 3.118764976, 3.088608603, 3.065939709, 3.050488408, 3.042000508, 3.040240947, 3.044995781, 3.056073118, 3.0733033, 3.096538562, 3.125652363, 3.160538486, 3.201110039, 3.24729838, 3.299052056, 3.356335741, 3.419129232, 3.487426489, 3.561234731, 3.640573593, 3.725474345, 3.815979158, 3.912140431, 4.014020161, 4.121689353, 4.235227476, 4.354721945, 4.480267635, 4.611966424, 4.749926744, 4.894263166, 5.045095985, 5.202550818, 5.366758215, 5.537853269, 5.71597523, 5.901267118, 6.093875335, 6.293949279, 6.50164094, 6.717104507, 6.940495954, 7.171972626, 7.411692818, 7.659815341, 7.916499083, 8.181902562, 8.456183475, 8.739498233, 9.032001497, 9.333845706, 9.645180605, 9.966152769, 10.29690513, 10.63757649, 10.98830109, 11.3492081, 11.72042121, 12.10205814, 12.49423027, 12.89704219, 13.31059133, 13.73496757, 14.17025293, 14.61652122, 15.07383779, 15.54225925, 16.02183326, 16.51259837};
            const float Platinum_k_values[] = {1.489348165, 1.486816275, 1.490754695, 1.501200368, 1.518068551, 1.541143778, 1.570077808, 1.604397448, 1.643523398, 1.686798845, 1.733524264, 1.782993612, 1.834527242, 1.887498163, 1.941350135, 1.99560773, 2.049879638, 2.103856915, 2.157307914, 2.210071291, 2.262048165, 2.313194103, 2.363511347, 2.413041515, 2.461858838, 2.510063971, 2.557778333, 2.605138947, 2.652293737, 2.699397239, 2.746606699, 2.794078535, 2.84196515, 2.89041209, 2.939555535, 2.989520137, 3.040417191, 3.092343158, 3.145378514, 3.199586953, 3.255014907, 3.311691386, 3.369628119, 3.428819971, 3.489245622, 3.550868465, 3.613637713, 3.677489683, 3.74234923, 3.80813131, 3.874742665, 3.942083596, 4.010049834, 4.078534485, 4.147430051, 4.216630519, 4.286033509, 4.355542473, 4.425068927, 4.494534703, 4.563874185, 4.633036499, 4.701987617, 4.770712315, 4.839215928, 4.907525832, 4.975692574, 5.04379056, 5.111918214, 5.180197482, 5.248772605, 5.31780799, 5.387485092, 5.457998129, 5.529548486, 5.602337649, 5.676558495, 5.752384768, 5.8299586, 5.909375973, 5.990670082, 6.073792697, 6.158593806, 6.244800115, 6.331993349, 6.419589852, 6.506823594, 6.59273543, 6.676172155, 6.755799402, 6.830132499, 6.897588665, 6.956562173, 7.005521178, 7.043121019, 7.068324636, 7.080517218, 7.079600577, 7.066053738, 7.04095021, 7.005928514, 6.963119571, 6.915040744, 6.864470345, 6.814317508, 6.767500678, 6.72684427, 6.694998408, 6.674382247, 6.667147822, 6.675159301, 6.699981851, 6.74287509, 6.804787843, 6.886353274, 6.987885915, 7.109383948, 7.250540828, 7.410769586, 7.589241014, 7.784934136, 7.996694689, 8.223295827, 8.463495128, 8.71608321, 8.979921219, 9.25396644, 9.537286921, 9.82906695, 10.12860564, 10.43531076, 10.74868978, 11.06833939, 11.39393476, 11.72521905, 12.06199371, 12.40410959, 12.75145927, 13.10397017, 13.46159875, 13.8243255, 14.1921507, 14.56509079, 14.94317534, 15.32644447, 15.7149467, 16.10873708, 16.50787565, 16.91242613, 17.32245473, 17.73802923, 18.15921811, 18.58608982, 19.01871215, 19.45715164, 19.90147307, 20.35173904, 20.80800952, 21.27034145, 21.73878847, 22.21340049, 22.69422347, 23.18129909, 23.67466448, 24.17435198, 24.68038888, 25.19279721, 25.71159349, 26.23678856, 26.76838736, 27.30638876, 27.85078539, 28.40156352, 28.95870287, 29.52217652, 30.09195083, 30.66798533, 31.25023268, 31.83863862, 32.43314198, 33.03367465, 33.64016168, 34.2525213, 34.87066504, 35.49449784, 36.12391822, 36.75881847, 37.39908487, 38.04459793, 38.6952327, 39.35085908, 40.01134216, 40.67654261, 41.3463171, 42.02051875, 42.69899756, 43.38160096, 44.0681743, 44.75856141, 45.45260512};
            const Data Platinum_eta = {
                DistributionType::Irregular,
                200, Platinum_lambdas[0], Platinum_lambdas[199],
                Platinum_lambdas,
                Platinum_eta_values
            };
            const Data Platinum_k = {
                DistributionType::Irregular,
                200, Platinum_lambdas[0], Platinum_lambdas[199],
                Platinum_lambdas,
                Platinum_k_values
            };
            
            const float Silver_lambdas[] = {206.6, 210.8950832, 215.2794584, 219.7549821, 224.323549, 228.9870936, 233.7475903, 238.6070547, 243.5675442, 248.6311593, 253.8000437, 259.0763859, 264.4624199, 269.9604262, 275.5727325, 281.3017151, 287.1497997, 293.1194622, 299.2132302, 305.4336838, 311.7834567, 318.2652374, 324.8817702, 331.6358565, 338.5303559, 345.5681877, 352.7523315, 360.0858291, 367.5717855, 375.2133702, 383.0138186, 390.9764334, 399.1045859, 407.4017175, 415.8713413, 424.5170432, 433.3424837, 442.3513996, 451.5476051, 460.9349939, 470.5175406, 480.2993023, 490.2844207, 500.4771234, 510.8817259, 521.5026335, 532.3443431, 543.4114449, 554.7086248, 566.2406659, 578.0124508, 590.0289637, 602.2952923, 614.8166301, 627.5982785, 640.6456494, 653.9642668, 667.5597698, 681.4379148, 695.6045776, 710.0657563, 724.8275738, 739.8962801, 755.2782553, 770.980012, 787.0081983, 803.3696005, 820.0711458, 837.1199057, 854.5230985, 872.2880927, 890.4224098, 908.933728, 927.8298847, 947.1188805, 966.8088824, 986.9082269, 1007.425424, 1028.369161, 1049.748305, 1071.571907, 1093.849209, 1116.589641, 1139.802833, 1163.498612, 1187.687011, 1212.378272, 1237.582849, 1263.311413, 1289.574857, 1316.384302, 1343.751098, 1371.686833, 1400.203333, 1429.312674, 1459.02718, 1489.359431, 1520.322271, 1551.928808, 1584.192425, 1617.126783, 1650.745825, 1685.063785, 1720.095194, 1755.854884, 1792.357996, 1829.619984, 1867.656625, 1906.484023, 1946.118619, 1986.577193, 2027.876875, 2070.035151, 2113.069871, 2156.999256, 2201.841905, 2247.616804, 2294.343334, 2342.041279, 2390.730835, 2440.432615, 2491.167664, 2542.957462, 2595.823938, 2649.789474, 2704.87692, 2761.109598, 2818.511318, 2877.106384, 2936.919604, 2997.976303, 3060.302332, 3123.92408, 3188.868484, 3255.163041, 3322.835819, 3391.915472, 3462.431247, 3534.413001, 3607.891209, 3682.896983, 3759.462079, 3837.618916, 3917.400583, 3998.840861, 4081.97423, 4166.83589, 4253.46177, 4341.888547, 4432.153661, 4524.295329, 4618.352565, 4714.36519, 4812.373858, 4912.420063, 5014.546166, 5118.795406, 5225.211921, 5333.840769, 5444.727941, 5557.920388, 5673.466033, 5791.4138, 5911.813626, 6034.716488, 6160.174423, 6288.240549, 6418.969089, 6552.415392, 6688.635959, 6827.688466, 6969.631786, 7114.526018, 7262.432509, 7413.413883, 7567.534063, 7724.858305, 7885.453218, 8049.386798, 8216.728453, 8387.549035, 8561.920869, 8739.917783, 8921.61514, 9107.089869, 9296.420502, 9489.687198, 9686.971786, 9888.357796, 10093.93049, 10303.77692, 10517.98592, 10736.64818, 10959.8563, 11187.70477, 11420.29007, 11657.71067, 11900.0671, 12147.46196, 12400};
            const float Silver_eta_values[] = {0.503999788, 0.554820958, 0.611868932, 0.67043925, 0.726540962, 0.776528285, 0.816935367, 0.844330284, 0.855169339, 0.846331284, 0.819421747, 0.79329035, 0.812406498, 0.917874624, 1.104524036, 1.319228003, 1.490719877, 1.562818987, 1.514228462, 1.357892978, 1.125224327, 0.85014736, 0.578743734, 0.389430467, 0.290153837, 0.236246301, 0.203455933, 0.181911029, 0.167145321, 0.156810411, 0.14951731, 0.144378232, 0.140797053, 0.138360408, 0.136775353, 0.135831121, 0.135374459, 0.135293095, 0.135504374, 0.13594725, 0.136576593, 0.13735906, 0.138270106, 0.139291779, 0.140411104, 0.141618887, 0.142908816, 0.144276802, 0.145720479, 0.147238829, 0.1488319, 0.15050059, 0.152246489, 0.154071751, 0.155979003, 0.157971271, 0.16005193, 0.162224655, 0.164493398, 0.166862361, 0.169335982, 0.171918921, 0.174616053, 0.177432469, 0.18037347, 0.183444568, 0.186651493, 0.190000195, 0.193496853, 0.197147877, 0.200959924, 0.204939902, 0.209094981, 0.213432607, 0.217960512, 0.222686727, 0.227619598, 0.232767793, 0.238140327, 0.243746567, 0.249596257, 0.255699529, 0.262066922, 0.268709401, 0.275638376, 0.28286572, 0.290403789, 0.298265445, 0.306464077, 0.315013622, 0.323928593, 0.333224096, 0.342915863, 0.353020274, 0.363554382, 0.374535949, 0.385983467, 0.397916193, 0.410354179, 0.423318305, 0.436830313, 0.450912843, 0.465589468, 0.480884733, 0.496824195, 0.513434461, 0.530743233, 0.548779353, 0.567572845, 0.587154963, 0.607558243, 0.628816553, 0.65096514, 0.674040694, 0.698081395, 0.723126981, 0.749218798, 0.776399875, 0.804714976, 0.834210679, 0.864935437, 0.896939655, 0.930275762, 0.964998289, 1.001163946, 1.038831708, 1.078062898, 1.11892127, 1.161473108, 1.20578731, 1.251935489, 1.299992068, 1.350034385, 1.402142793, 1.456400772, 1.512895035, 1.57171564, 1.632956111, 1.696713552, 1.763088769, 1.832186396, 1.90411502, 1.978987313, 2.056920162, 2.138034801, 2.222456955, 2.310316972, 2.401749968, 2.496895969, 2.595900054, 2.698912502, 2.806088939, 2.917590485, 3.033583902, 3.154241743, 3.279742499, 3.410270747, 3.546017292, 3.687179317, 3.83396052, 3.986571256, 4.145228666, 4.310156816, 4.481586816, 4.659756942, 4.844912748, 5.037307172, 5.23720063, 5.444861105, 5.660564222, 5.884593308, 6.117239447, 6.358801512, 6.609586188, 6.869907969, 7.140089149, 7.420459779, 7.711357615, 8.013128031, 8.32612392, 8.650705557, 8.987240439, 9.336103101, 9.697674892, 10.07234373, 10.46050379, 10.86255523, 11.2789038, 11.70996043, 12.15614086, 12.6178651, 13.09555694, 13.58964341, 14.10055418, 14.6287209, 15.17457654, 15.73855468, 16.32108873, 16.92261115, 17.54355259};
            const float Silver_k_values[] = {0.870386411, 0.965578875, 1.040242475, 1.096341297, 1.135840896, 1.161002053, 1.174636506, 1.180459342, 1.183906271, 1.194218806, 1.227856261, 1.306116428, 1.431451699, 1.560801145, 1.626006049, 1.579310897, 1.418168985, 1.182364291, 0.93218021, 0.722775908, 0.5898898, 0.554446353, 0.636611155, 0.809939685, 0.988366492, 1.142997215, 1.277546508, 1.397923201, 1.508215394, 1.61110819, 1.708435293, 1.801510652, 1.89131464, 1.97860223, 2.063969349, 2.14789577, 2.230774088, 2.312930054, 2.394637297, 2.476128263, 2.557602506, 2.639233084, 2.721171565, 2.80355198, 2.886493978, 2.970105359, 3.05448413, 3.139720177, 3.225896632, 3.313090997, 3.401376086, 3.490820792, 3.581490743, 3.673448843, 3.76675574, 3.861470215, 3.957649517, 4.055349655, 4.154625646, 4.255531731, 4.358121566, 4.462448389, 4.568565164, 4.676524715, 4.786379844, 4.898183431, 5.011988534, 5.12784847, 5.245816899, 5.365947891, 5.488295994, 5.612916297, 5.739864485, 5.869196893, 6.000970558, 6.135243262, 6.272073584, 6.411520934, 6.553645603, 6.698508794, 6.846172667, 6.99670037, 7.150156078, 7.306605027, 7.466113545, 7.628749089, 7.794580275, 7.963676909, 8.13611002, 8.311951891, 8.491276088, 8.674157491, 8.860672324, 9.050898183, 9.24491407, 9.442800415, 9.644639112, 9.850513544, 10.06050861, 10.27471076, 10.49320802, 10.71609001, 10.943448, 11.17537489, 11.41196529, 11.65331551, 11.89952362, 12.15068944, 12.40691458, 12.66830248, 12.93495842, 13.20698955, 13.48450492, 13.76761548, 14.05643414, 14.35107576, 14.65165719, 14.95829729, 15.27111694, 15.59023906, 15.91578864, 16.24789273, 16.5866805, 16.93228321, 17.28483423, 17.64446906, 18.01132535, 18.38554288, 18.76726357, 19.1566315, 19.55379288, 19.95889607, 20.37209157, 20.79353199, 21.22337206, 21.66176861, 22.10888053, 22.56486878, 23.0298963, 23.50412806, 23.98773096, 24.4808738, 24.98372723, 25.49646373, 26.01925747, 26.55228434, 27.0957218, 27.64974883, 28.21454585, 28.79029458, 29.37717801, 29.97538021, 30.58508625, 31.20648205, 31.83975427, 32.4850901, 33.14267717, 33.81270332, 34.49535642, 35.19082422, 35.89929408, 36.62095279, 37.35598633, 38.10457961, 38.86691622, 39.64317814, 40.43354548, 41.23819615, 42.05730557, 42.89104631, 43.73958776, 44.6030958, 45.48173235, 46.37565506, 47.28501688, 48.20996563, 49.1506436, 50.10718709, 51.07972598, 52.06838324, 53.07327449, 54.09450751, 55.13218173, 56.18638778, 57.25720697, 58.34471079, 59.44896044, 60.57000628, 61.7078874, 62.86263109, 64.0342524, 65.22275365, 66.428124, 67.65033903, 68.88936031, 70.14513504, 71.4175957, 72.70665975, 74.01222931, 75.33419097};
            const Data Silver_eta = {
                DistributionType::Irregular,
                200, Silver_lambdas[0], Silver_lambdas[199],
                Silver_lambdas,
                Silver_eta_values
            };
            const Data Silver_k = {
                DistributionType::Irregular,
                200, Silver_lambdas[0], Silver_lambdas[199],
                Silver_lambdas,
                Silver_k_values
            };
            
            const float Titanium_lambdas[] = {188, 192, 195, 199, 203, 207, 212, 216, 221, 226, 231, 237, 243, 249, 255, 262, 269, 276, 284, 292, 301, 311, 320, 332, 342, 354, 368, 381, 397, 413, 431, 451, 471, 496, 521, 549, 582, 617, 659, 704, 756, 821, 892, 984, 1088, 1216, 1393, 1610, 1937};
            const float Titanium_eta_values[] = {1.1, 1.16, 1.22, 1.25, 1.27, 1.31, 1.31, 1.32, 1.32, 1.32, 1.31, 1.3, 1.28, 1.27, 1.26, 1.27, 1.27, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.61, 1.72, 1.82, 1.9, 1.99, 2.08, 2.14, 2.21, 2.27, 2.32, 2.36, 2.44, 2.54, 2.6, 2.67, 2.76, 2.86, 3, 3.21, 3.29, 3.35, 3.5, 3.62, 3.67, 3.69, 3.51};
            const float Titanium_k_values[] = {1.62, 1.64, 1.66, 1.68, 1.69, 1.69, 1.68, 1.67, 1.66, 1.66, 1.68, 1.72, 1.77, 1.83, 1.91, 1.99, 2.07, 2.17, 2.26, 2.36, 2.46, 2.57, 2.66, 2.74, 2.82, 2.87, 2.9, 2.93, 2.95, 2.98, 3.01, 3.04, 3.1, 3.19, 3.3, 3.43, 3.58, 3.72, 3.84, 3.96, 4.01, 4.01, 3.96, 3.97, 4.02, 4.15, 4.37, 4.7, 5.19};
            const Data Titanium_eta = {
                DistributionType::Irregular,
                49, Titanium_lambdas[0], Titanium_lambdas[48],
                Titanium_lambdas,
                Titanium_eta_values
            };
            const Data Titanium_k = {
                DistributionType::Irregular,
                49, Titanium_lambdas[0], Titanium_lambdas[48],
                Titanium_lambdas,
                Titanium_k_values
            };
            
            
            
            const std::map<std::string, std::vector<Data>> database = {
                {"Air", {Air_eta}},
                {"Water", {Water_eta, Water_k}},
                {"Glass_BK7", {Glass_BK7_eta}},
                {"Diamond", {Diamond_eta}},
                {"Aluminium", {Aluminium_eta, Aluminium_k}},
                {"Copper", {Copper_eta, Copper_k}},
                {"Gold", {Gold_eta, Gold_k}},
                {"Iron", {Iron_eta, Iron_k}},
                {"Lead", {Lead_eta, Lead_k}},
                {"Mercury", {Mercury_eta, Mercury_k}},
                {"Platinum", {Platinum_eta, Platinum_k}},
                {"Silver", {Silver_eta, Silver_k}},
                {"Titanium", {Titanium_eta, Titanium_k}},
            };
        }
        
        
        
        SLR_API bool queryIlluminantSpectrum(const std::string &name, uint32_t index, Data* data) {
            if (Illuminant::database.count(name) > 0) {
                if (index < Illuminant::database.at(name).size()) {
                    *data = Illuminant::database.at(name).at(index);
                    return true;
                }
            }
            
            return false;
        }
        
        SLR_API bool queryReflectanceSpectrum(const std::string &name, uint32_t index, Data* data) {
            if (Reflectance::database.count(name) > 0) {
                if (index < Reflectance::database.at(name).size()) {
                    *data = Reflectance::database.at(name).at(index);
                    return true;
                }
            }
            
            return false;
        }
        
        SLR_API bool queryIoRSpectrum(const std::string &name, uint32_t index, Data* data) {
            if (IoR::database.count(name) > 0) {
                if (index < IoR::database.at(name).size()) {
                    *data = IoR::database.at(name).at(index);
                    return true;
                }
            }
            
            return false;
        }
    }
}
